package spirit;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {
	// 콜렉션 collection
	// 객체지향 기반 프로그램 작성시
	// 종종 같은 종류의 객체의 묶음group이나
	// 다른 종류의 객체묶음과 함께 사용 쓰는때가 있음

	// 앞서 배운 배열은 같은 종류의 객체 묶음 이지만
	// 유연성이 부족하고, 크기 조정도 안되고
	// 다른 종류의 객체도 가질 수 없음

	// 다행히 자바에는 이러한 종류의 객체를 쉽게 다룰 수 있도록 인터페이스와 클래스를 제공
	// 그것은 바로 Collection 프레임워크임

	// collection은 다른 종류로 구성된 객체들의 묶음을 의미
	// 또 다른 말로 용기 container 라고도 하는데,
	// 이것을 이용해서 객체들의 묶음을
	// 각 요소를 저장, 검색, 조작하는 메서드를 제공

	// Collection <- Set, List, Queue
	// List <- ArrayList , Vector
	// Map <- AbstractMap, sortedMap
	// AbstractMap <- HashMap
	// Iterator, Comparator

	// 이들 대부분은 java.util 패키지의 포함됨

	// List - 동적 배열
	// Collection의 가장 인기있는 하위 인터페이스임
	// ArrayList는 List에서 가장 자주사용되는 구현클래스
	// List는 자료를 순서대로 저장하는 특성을 가짐
	// FIFO : first in first out 선입선출
	// 또한, 데이터를 중복으로 저장가능
	// 단, set은 중복 허용불가!
	// add 메서드를 통해 데이터를 List의 맨 끝에 추가
	// 지네릭 generic 
	// collection 을 배울떄 generic을 뺴놓으면
	// 불완전하게 collection을 배우는 것임
	// 컴파일시간때 엄격한 자료형에 검사를 지원
	// 또한, collection을 다를때 대부분의
	// downcasting을 제거하고 사용할 수 있음
	// 또한, c++에서 제공하는 클래스 템플릿을
	// 작성할 수 있게 해줌(고급)
	
	// 지네릭에서는 매개변수 자료형 parameterized type을 이용
	// collection 요소의 자료형을 지정함
	// 메서드의 매개변수 ()안에 사용하는 것처럼
	// collection에서는 <>안에 매개변수자료형을 사용
	// List<String> result = null;

	public static void main(String[] args) {
		List a = new ArrayList();
		a.add(21321); // 숫자
		a.add("숙"); // 문자
		a.add(123.456); // 배열
		a.add("김태희");
		a.add(new J03_MemberVO());
		System.out.println(a);
		
		// ArrayList에 저장된 객체를 하나씩 꺼내 출력
		System.out.println(a.get(0));
		System.out.println(a.get(1));
		System.out.println(a.get(2));
		System.out.println(a.get(3));
		System.out.println(a.get(4));
		
		//변수에 따로 저장
		int num = (int) a.get(0);
		//char chr = (char)a.get(1);
		//float fnum = (float) a.get(2);
		String str = (String) a.get(3);
		// 하지만, 이렇게 해도 오류는 x
		//Integer intg = (Integer) a.get(3); 		// String
		//char num2 = (char) a.get(0);			// int
		//int xyc = (int) a.get(3);
		// 이유 : ArrayList에 객체를 저장할때는
		// 대상이 무엇이든간에 무조건 Object형으로
		// 저장됨.따라서, ArrayList에 저장된 객체를
		// 꺼낼때는 객체의 자료형에 맞춰 downcasting이 필요(JDK 5 이전)
		//int xyz = "abc";
		//지네릭을 사용했을 경우
		List<String> abc = new ArrayList<String>();
		//List<String> abc = new ArrayList<>(); // jdk1.7
		// abc라는 콜렉션(동적배열)에는
		// String형식의 값만 추가할 수 있다는 의미 
		//abc.add(123);  //자료형 검사후 오류 표시
		//abc.add('a'); 
		abc.add("김태희");		// 정상처리
		
		String xyz = abc.get(0); // 형변한은 필요x
		
		List<J03_MemberVO> results = new ArrayList<J03_MemberVO>();
	}

}
